package com.cardone.platform.configuration.service;

import java.util.List;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.transaction.annotation.Transactional;

import com.cardone.common.cache.Caches;
import com.cardone.common.dto.PaginationDto;
import com.cardone.platform.configuration.dto.SiteDto;

/**
 * 站服务
 *
 * @author yaohaitao
 */
public interface SiteService {
	/**
	 * spring bean id
	 */
	String BEAN_ID = "com.cardone.platform.configuration.service.SiteService";

	/**
	 * 保存:站
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param saveSite
	 *          站对象
	 *
	 * @return 站对象
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = SiteService.BEAN_ID, allEntries = true)
	<P> P saveByIdOrCode(final Class<P> mappedClass, final SiteDto saveSite);

	/**
	 * 初始化数据字典
	 *
	 * @param initSiteList
	 *          初始化数据字典对象集合
	 * @return
	 */
	@Transactional
	@CacheEvict(value = SiteService.BEAN_ID, allEntries = true)
	void init(final List<SiteDto> initSiteList);

	/**
	 * 插入
	 *
	 * @param insertSite
	 *          站对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = SiteService.BEAN_ID, allEntries = true)
	int insertByCode(final SiteDto insertSite);

	/**
	 * 删除
	 *
	 * @param deleteSite
	 *          站对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = SiteService.BEAN_ID, allEntries = true)
	int deleteByIds(final SiteDto deleteSite);

	/**
	 * 更新
	 *
	 * @param updateSite
	 *          站对象
	 *
	 * @return 影响行数
	 */
	@Deprecated
	@Transactional
	@CacheEvict(value = SiteService.BEAN_ID, allEntries = true)
	int updateByCode(final SiteDto updateSite);

	/**
	 * 查询
	 *
	 * @param readSite
	 *          站对象
	 * @return 返回数据
	 */
	@Deprecated
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_1)
	Integer readByCodeNqIdForCount(final SiteDto readSite);

	/**
	 * 读取标识
	 *
	 * @param code
	 *          代码
	 * @return 返回数据
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_1)
	String readIdByCode(final String code);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findSite
	 *          站对象
	 * @return 返回对象
	 */
	@Deprecated
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> P findById(final Class<P> mappedClass, final SiteDto findSite);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findSite
	 *          站对象
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> P findByCodeOrId(final Class<P> mappedClass, final SiteDto findSite);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 * @param serverName
	 *          服务名
	 * @param projectCode
	 *          项目代码
	 * @param code
	 *          站点代码
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_4)
	<P> P findByServerName(final Class<P> mappedClass, final String serverName, final String projectCode, final String code);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param code
	 *          代码
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> P findByCode(final Class<P> mappedClass, final String code);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param siteUrlCode
	 *          站路径代码
	 *
	 * @return 返回对象
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> P findBySiteUrlCode(final Class<P> mappedClass, final String siteUrlCode);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param findListSite
	 *          站对象
	 *
	 * @return 站对象集合
	 */
	@Deprecated
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> List<P> findListByLikeCode(final Class<P> mappedClass, final SiteDto findListSite);

	/**
	 * 查询
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param projectCode
	 *          项目代码
	 *
	 * @return 站对象集合
	 */
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> List<P> findListByProjectCode(final Class<P> mappedClass, final String projectCode);

	/**
	 * 分页
	 *
	 * @param mappedClass
	 *          返回类型
	 *
	 * @param paginationSite
	 *          站对象
	 *
	 * @return 站分页对象
	 */
	@Deprecated
	@Cacheable(value = SiteService.BEAN_ID, key = Caches.KEY_2)
	<P> PaginationDto<P> paginationByLikeCode(final Class<P> mappedClass, final SiteDto paginationSite);
}